到了第八天,今天來講 Laravel Route (路由)的設定,Laravel 這個框架提供了完整的 MVC 架構,也可用相當方便的語法來實現 RESTful API,而這一切都可以透過 Route 來完成。
今天下班後想說回家趕稿,但是明華園天字團竟然在住處門口演出 XDDDDDD,我得趕快寫完去看歌仔戲囉~~
路由的概念可以想像成提供你的程式一個路徑,引導它傳送資訊到這確的地方。Laravel Route 的設計即是將真實的檔案路徑隱藏起來,若是寫過純 PHP 的開發者應該不陌生,過去如果沒有特別進行 Route 的設計,你的專案目錄及結構就會暴露在 URL 當中,而 Laravel 的 Route 可以將你的請求導到某個 function 中,非常的方便。
Route 的設定檔在 routes/
目錄內,可以參考一下我在 Day4 裡目錄結構的說明,一般的網站開發來說,我們大多使用 web.php
、api.php
這兩個檔案就可以完成 Route 的設定囉!
我們這邊以 web.php
這個檔案設定為例,至於 api.php
,我們留著等之後講 RESTful API 時再詳細說明。
程式碼:
Route::get('/', function () {
return view('welcome');
});
以這個範例來說,你的網址 example.com
後面若是沒帶任何參數,就會被導向 welcome
這個頁面,因為 '/'
代表的是整個網址的 root,後面則用 callback 的方式寫入函數,描述你進入到這個 Route 後要做的事情。Route::
後面則是設定你的 HTTP 請求方法,通常會有 get
、post
、put/patch
、delete
等方式,RESTful API 規範了這些方法的用途,之後會在寫成一篇告訴大家。
你也可以設定不同的網址名稱,例如:
Route::get('/welcome', function () {
return view('welcome');
});
這樣當你的網址變成 example.com/welcome
時才會被導到 welcome 這個頁面。
這個用法也其實很簡單,在上面的範例,我們是使用 callback 的方式直接將 Route 要做的事情寫在後面,但是這樣當我們要處理的事情越來越多,整個程式碼會越來越長,最後導致難以維護。
因此 Laravel 這邊提供了 Controller,讓你將 Route 導到 function 中直接進行你要做的事情。
程式碼範例如下 (Laravel 8 前)
Route::get('/product', 'ProductController@list');
原本後面應該被寫成 function 的部分改為 'ProductController@list'
,ProductController
指的是 Controller 的名字,list
則是寫在 ProductController
裡面的 function 名稱。
而這個 Route 的寫法在今年 9 月 Laravel 8 推出後,有了修改,上面的範例程式被改寫成下方的樣子:
Route::get('product', [ProductController::class, 'list'])
這個寫法我認為對開發者來說更友善,因為 ProductController
實際上來說的確就是一個 class
,因此 Laravel 8 的寫法更直觀,如果你剛好是使用最新版的 Laravel 進行開發,請特別注意喔!
另外,Laravel 官方也建議開發者能使用以下方式為路由命名。
Route::get('product', [ProductController::class, 'list'])->name('product');
為路由命名能夠幫助你更方便產生網址或導向到特定路由,如下所示。
// 取得 URLs
$url = route('product');
// 導向
return redirect()->route('product');
除此之外,我曾經接手過某個專案,並沒有為每個路由命名,程式裡面有用到 URL,都被直接寫死,結果之後當客戶更改需求,我需要修改 URL 時就噴錯誤,找了好久才找到問題,因此多善用 Naming,之後要更改也方便很多。
明天我們繼續講 Controller,大家再見,我要去看歌仔戲了XDDDDDDDD